/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BeansGerenciaveis;

import DAO.ObraDao;
import bean.Apoio;
import bean.Autor;
import bean.Editora;
import bean.Obra;
import bean.Tema;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.primefaces.model.chart.PieChartModel;

/**
 *
 * @author jorge
 */
@ManagedBean
@SessionScoped
public class ObraBean {

    /**
     * Creates a new instance of ObraBean
     */
    public ObraBean() {

        this.filtroApoio = new Apoio();
        this.filtroAutor = new Autor();
        this.filtroEditora = new Editora();
        this.filtroObras = new ArrayList<Obra>();
        this.obraSelecionada = new Obra();
        this.pieModel = new PieChartModel();
        this.obraDao = new ObraDao();
        this.filtroObras = new ArrayList<Obra>();
        this.filtroApoio = new Apoio();
        this.filtroAutor = new Autor();
        this.filtroEditora = new Editora();
        this.filtroTema = new Tema();
        this.filtro1 = new String();
        this.filtro1limitador = new String();
        this.filtro2 = new String();
        this.filtro2limitador = new String();
        this.filtro3 = new String();
        this.filtro3limitador = new String();
        this.filtro4 = new String();
        this.filtro4limitador = new String();
        this.pieModel = new PieChartModel();
        this.pieModelAno = new PieChartModel();
        this.pieModelEstados = new PieChartModel();
    }

    public DataModel<Obra> getObras() {
        if (obras == null) {
            this.carregarObras();
        }
        return obras;
    }

    public void setObras(DataModel<Obra> obras) {
        this.obras = obras;
    }

    public List<Obra> getListaObras() {
        if (listaObras == null) {
            this.carregarObras();
        }
        return listaObras;
    }

    public void setListaObras(List<Obra> listaObras) {
        this.listaObras = listaObras;
    }

    public ObraDao getObraDao() {
        return obraDao;
    }

    public void setObraDao(ObraDao obraDao) {
        this.obraDao = obraDao;
    }

    public Obra getObraSelecionada() {
        return obraSelecionada;
    }

    public void setObraSelecionada(Obra obraSelecionada) {

        this.obraSelecionada = obraSelecionada;
    }

    public void carregarObras() {
        obraDao = new ObraDao();
        listaObras = this.obraDao.listar();
        obras = new ListDataModel<Obra>(listaObras);
    }

    public List<Obra> getFiltroObras() {
        return filtroObras;
    }

    public void setFiltroObras(List<Obra> filtroObras) {
        this.filtroObras = filtroObras;
    }

    public String getFiltro1() {
        return filtro1;
    }

    public void setFiltro1(String filtro1) {
        this.filtro1 = filtro1;
    }

    public String getFiltro2() {
        return filtro2;
    }

    public void setFiltro2(String filtro2) {
        this.filtro2 = filtro2;
    }

    public String getFiltro3() {
        return filtro3;
    }

    public void setFiltro3(String filtro3) {
        this.filtro3 = filtro3;
    }

    public String getFiltro4() {
        return filtro4;
    }

    public void setFiltro4(String filtro4) {
        this.filtro4 = filtro4;
    }

    public Apoio getFiltroApoio() {
        return filtroApoio;
    }

    public void setFiltroApoio(Apoio filtroApoio) {
        this.filtroApoio = filtroApoio;
    }

    public Autor getFiltroAutor() {
        return filtroAutor;
    }

    public void setFiltroAutor(Autor filtroAutor) {
        this.filtroAutor = filtroAutor;
    }

    public String getFiltro1limitador() {
        return filtro1limitador;
    }

    public void setFiltro1limitador(String filtro1limitador) {
        this.filtro1limitador = filtro1limitador;
    }

    public String getFiltro2limitador() {
        return filtro2limitador;
    }

    public void setFiltro2limitador(String filtro21limitador) {
        this.filtro2limitador = filtro21limitador;
    }

    public String getFiltro3limitador() {
        return filtro3limitador;
    }

    public void setFiltro3limitador(String filtro3limitador) {
        this.filtro3limitador = filtro3limitador;
    }

    public String getFiltro4limitador() {
        return filtro4limitador;
    }

    public void setFiltro4limitador(String filtro4limitador) {
        this.filtro4limitador = filtro4limitador;
    }

    public Editora getFiltroEditora() {
        return filtroEditora;
    }

    public void setFiltroEditora(Editora filtroEditora) {
        this.filtroEditora = filtroEditora;
    }

    public String consultaObraFiltro() {
        filtroObras = obraDao.consultaObraFiltro(filtro1, filtro1limitador, filtro2, filtro2limitador, filtro3, filtro3limitador, filtro4, filtro4limitador, filtroApoio, filtroAutor, filtroEditora);
        numeroObrasResultado = filtroObras.size();
        obraDao = new ObraDao();


        totalObras = obraDao.numeroObrasCadastradas();

        System.out.println("Dados gráfico: numero colunas pesquisa = " + numeroObrasResultado + ", numero total obras = " + totalObras);
        createPieModel();
        criarPieModelEstados();
        criarPieModelAno();
        return ("/eixo_inovacao/resultado_pesquisa_bibliometria.xhtml?faces-redirect=true");

    }

    public String getConsultaFiltros() {
        return consultaFiltros;
    }

    public void setConsultaFiltros(String consultaFiltros) {
        this.consultaFiltros = consultaFiltros;
    }

    public int getNumeroObrasResultado() {
        return numeroObrasResultado;
    }

    public void setNumeroObrasResultado(int numeroObrasResultado) {
        this.numeroObrasResultado = numeroObrasResultado;
    }

    public String getFiltrosAtivos() {
        filtrosAtivos = "<ol>";
        if (!filtro1.equalsIgnoreCase("naoSelecionado")) {
            filtrosAtivos = filtrosAtivos + "<li>" + filtro1 + " : " + filtro1limitador + "<li/>";

        }
        if (!filtro2.equalsIgnoreCase("naoSelecionado")) {
            filtrosAtivos = filtrosAtivos + "<li>" + filtro2 + " : " + filtro2limitador + "<li/>";

        }
        if (!filtro3.equalsIgnoreCase("naoSelecionado")) {
            filtrosAtivos = filtrosAtivos + "<li>" + filtro3 + " : " + filtro3limitador + "<li/>";

        }
        if(!(this.filtroAutor.getId() == 0)){
            filtrosAtivos = filtrosAtivos + "<li>" + "Autor " + filtroAutor.getUltimoNome() + "," + filtroAutor.getRestanteNome() + "<li/>";            
        }
        if(!(this.filtroApoio.getId() == 0)){
            filtrosAtivos = filtrosAtivos + "<li>" + "Apoio " + filtroApoio.getNome() + "<li/>"; 
        }
        if(!(this.filtroTema.getId() == 0)){
            filtrosAtivos = filtrosAtivos + "<li>" + "Tema " + filtroTema.getTema() + "<li/>"; 
        }
        
        filtrosAtivos = filtrosAtivos + "<ol/>";
        System.out.println("Filtros ativos: " + filtrosAtivos);
        return filtrosAtivos;
    }

    public void setFiltrosAtivos(String filtrosAtivos) {
        this.filtrosAtivos = filtrosAtivos;
    }

    public int getTotalObras() {
        return totalObras;
    }

    public void setTotalObras(int totalObras) {
        this.totalObras = totalObras;
    }

    public PieChartModel getPieModel() {
        return pieModel;
    }

    private void createPieModel() {
        pieModel = new PieChartModel();

        pieModel.set("Obras Pesquisadas", numeroObrasResultado);
        pieModel.set("Total de Obras", totalObras - numeroObrasResultado);
        pieModel.setTitle("Por universo de pesquisa");
        pieModel.setLegendPosition("s" );
        pieModel.setShowDataLabels(true);
        pieModel.setDiameter(200);
    }

    private void criarPieModelEstados() {
        mapa = new HashMap< String, Integer>();
        Iterator i = filtroObras.iterator();

        while (i.hasNext())//Enquanto houver mais entradas  
        {
            Obra o = (Obra) i.next();

            // Se o mapa tiver a palavra  
            if (mapa.containsKey(o.getUfPublicacao())) // Palavras esta no mapa  
            {
                int contador = mapa.get(o.getUfPublicacao()); // Obtem contagem atual  
                mapa.put(o.getUfPublicacao(), contador + 1); // Incrementa a contagem  
            } else {
                mapa.put(o.getUfPublicacao(), 1); // Adiciona uma nova palavra com contagem de 1 ao mapa  
            }
        }

        Set< String> keys = mapa.keySet(); // Obtem as classes  

        // Classifica as classes  
        TreeSet< String> orderedKeys = new TreeSet< String>(keys);
        System.out.println("Palavras Contidas na frase: \nPalavras\t\t Ocorrencias");
        pieModelEstados = new PieChartModel();
        
        // Gera a saida de cada chave no mapa  
        for (String key : orderedKeys) {
            pieModelEstados.set(key, mapa.get(key));
            System.out.printf("%-10s%10s\n", key, mapa.get(key));
        }
        pieModelEstados.setTitle("Por UF da publicação:");
        pieModelEstados.setLegendPosition("w" );
        pieModelEstados.setShowDataLabels(true);
        pieModelEstados.setDiameter(200);
        System.out.printf("\nQuantidade de palavras:%d\nFrase esta vazia%b\n", mapa.size(), mapa.isEmpty());


    }
    
    private void criarPieModelAno() {
        HashMap< Integer, Integer> mapaAno = new HashMap< Integer, Integer>();
        Iterator i = filtroObras.iterator();

        while (i.hasNext())//Enquanto houver mais entradas  
        {
            Obra o = (Obra) i.next();

            // Se o mapa tiver a palavra  
            if (mapaAno.containsKey(o.getAnoPublicacao())) // Palavras esta no mapa  
            {
                int contador = mapaAno.get(o.getAnoPublicacao()); // Obtem contagem atual  
                mapaAno.put(o.getAnoPublicacao(), contador + 1); // Incrementa a contagem  
            } else {
                mapaAno.put(o.getAnoPublicacao(), 1); // Adiciona uma nova palavra com contagem de 1 ao mapa  
            }
        }

        Set< Integer> keys = mapaAno.keySet(); // Obtem as classes  

        // Classifica as classes  
        TreeSet< Integer> orderedKeys = new TreeSet< Integer>(keys);
        
        pieModelAno = new PieChartModel();
        
        // Gera a saida de cada chave no mapa  
        for (Integer key : orderedKeys) {
            pieModelAno.set(key.toString(), mapaAno.get(key));
            
        }

        pieModelAno.setTitle("Por Ano da publicação:");
        pieModelAno.setLegendPosition("w" );
        pieModelAno.setShowDataLabels(true);
        pieModelAno.setDiameter(200);


    }
    

    public Tema getFiltroTema() {
        return filtroTema;
    }

    public void setFiltroTema(Tema filtroTema) {
        this.filtroTema = filtroTema;
    }

    public List<Obra> getListaObrasSimplificado() {
        if (listaObrasSimplificado == null) {
            listaObrasSimplificado = obraDao.listarObrasSimplificado();
        }
        return listaObrasSimplificado;
    }

    public void setListaObrasSimplificado(List<Obra> listaObrasSimplificado) {
        this.listaObrasSimplificado = listaObrasSimplificado;
    }

    public PieChartModel getPieModelEstados() {
        return pieModelEstados;
    }

    public void setPieModelEstados(PieChartModel pieModelEstados) {
        this.pieModelEstados = pieModelEstados;
    }

    public Map<String, Integer> getMapa() {
        return mapa;
    }

    public void setMapa(Map<String, Integer> mapa) {
        this.mapa = mapa;
    }

    public PieChartModel getPieModelAno() {
        return pieModelAno;
    }

    public void setPieModelAno(PieChartModel pieModelAno) {
        this.pieModelAno = pieModelAno;
    }

  
    
    
    private Map< String, Integer> mapa;
    private PieChartModel pieModelAno;
    private PieChartModel pieModelEstados;
    private PieChartModel pieModel;
    private Obra obraSelecionada;
    private ObraDao obraDao;
    private DataModel<Obra> obras;
    private List<Obra> listaObras;
    private List<Obra> filtroObras;
    private Apoio filtroApoio;
    private Autor filtroAutor;
    private Editora filtroEditora;
    private String filtro1;
    private String filtro1limitador;
    private String filtro2;
    private String filtro2limitador;
    private String filtro3;
    private String filtro3limitador;
    private String filtro4;
    private String filtro4limitador;
    private String consultaFiltros;
    private int numeroObrasResultado;
    private String filtrosAtivos;
    private int totalObras;
    private Tema filtroTema;
    private List<Obra> listaObrasSimplificado;
    
}
